﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AccesoBD;
using CapaLogica.CL.UtilidadesGenerales;
using System.Data.SqlClient;
using CapaLogica.CL.Usuario;


namespace CapaLogica.CL.Blog
{
    public  class BlogPersistente
    {
        AcessoBD _acceso = new AcessoBD();

        internal void registrarBlog(Cl_Blog pblog, int pIdUsuario)//parametros del grupo
        {
            Parametros[] parametros = new Parametros[2];
            String sql = @"insert into dbo.T_Blog(id_usuario, nombre)
                                values(param1, param2) ";

            parametros[0] = new Parametros(pblog.IdPersona, "param1");
            parametros[1] = new Parametros(pblog.Nombre, "param2");
            try
            {
                _acceso.executeSQL(sql, parametros);

                //BITACORA
                Modulo.insertarBitacora(pIdUsuario, "Creación de un nuevo blog", pblog.Id, 10, 1);
                //---------------

            }
            catch (Exception ex)
            {
                SqlException exsql = ex as SqlException;
                SqlError er = exsql.Errors[0];

                if (er.Number == 2601)
                {
                    throw new Exception("Ya hay una blog creado para ese usuario");
                }
                else
                {
                    throw new Exception("Ha habido un error al registrar el blog. " + er.Number);
                }
            }
        }



        /// <summary>
        /// Método de la clase encargada de insertar una nueva Carrera a la BD
        /// </summary>
        /// <param name="pGrupo">Objeto carrera, tipo Carrera</param>
        /// <param name="pUsuario">Usuario que realiza la accion, tipo int</param>
        /// <remarks></remarks>
        internal String eliminarBlog(int pid, int pIdUsuario)//parametros del grupo
        {

            Parametros[] parametros = new Parametros[1];
            String sql = @"Delete dbo.T_Blog where id_usuario = param1";

            parametros[0] = new Parametros(pid, "param1");

            try
            {
                _acceso.executeSQL(sql, parametros);

          
                    //BITACORA
                Modulo.insertarBitacora(Session.Id, "Eliminacion de un Blog", pid, 10, 2);
                    //---------------
                    return ("El blog se ha eliminado con éxito");

            }
            catch (Exception)
            {
                throw new Exception("Error al eliminar el blog y devolver la Base de Datos a un estado válido.");
            }
        }


        internal bool buscarBlog(int pid)//parametros del grupo
        {

            string psp = @"dbo.sp_buscar_id_blog";
            Parametros[] parametros = new Parametros[1];
            parametros[0] = new Parametros(pid, "idUsuario");

            try
            {
                SqlDataReader reader = _acceso.execute_SP_Consulta(psp, parametros);
                List<int> ids = new List<int>();
                while (reader.Read())
                {
                    ids.Add(reader.GetInt32(0));
                }

                reader.Close();
                
                if(ids.Count == 0)
                {
                    return false;
                }
                else
                {
                    return true;
                }
    
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }





        internal String activarBlog(int pid, int pIdUsuario)//parametros del grupo
        {
            bool entra= false;
            String msj;

            try
            {
                
                string psp = @"dbo.sp_buscar_estado_blog";

                Parametros[] parametros1 = new Parametros[1];
                parametros1[0] = new Parametros(pid, "id");

                SqlDataReader reader = _acceso.execute_SP_Consulta(psp, parametros1);

                while (reader.Read())
                {
                    
                    entra = reader.GetBoolean(0);

                }

                reader.Close();

            }
            catch (Exception ex)
            {
                throw ex;
            }


            if (!entra)
            {

                Parametros[] parametros = new Parametros[1];
                String sql = @"Update dbo.T_Blog SET estado = 1 where id_usuario = param1";

                parametros[0] = new Parametros(pid, "param1");

                try
                {

                    _acceso.executeSQL(sql, parametros);
                    //BITACORA
                    Modulo.insertarBitacora(pIdUsuario, "Activación de un Blog", pid, 10, 4);
                    //---------------
                    msj = "¡El blog ha sido activado!";
                }
                catch (Exception)
                {
                    throw new Exception("Error al activar el blog y devolver la Base de Datos a un estado válido.");
                }

            }
            else
            {
                msj = "¡El blog ya estaba activado!";
            }

            return msj;

        }
 


        /// <summary>
        /// Método de la clase encargada de insertar una nueva Carrera a la BD
        /// </summary>
        /// <param name="pGrupo">Objeto carrera, tipo Carrera</param>
        /// <param name="pUsuario">Usuario que realiza la accion, tipo int</param>
        /// <remarks></remarks>
        internal String desactivarBlog(int pid, int pIdUsuario, SqlTransaction ptransaccion)//parametros del grupo
        {
            bool entra= false;
            String msj;
            try
            {
                string psp = @"dbo.sp_buscar_estado_blog";

                Parametros[] parametros1 = new Parametros[1];
                parametros1[0] = new Parametros(pid, "id");

                SqlDataReader reader = _acceso.execute_SP_Consulta(psp, parametros1);

                while (reader.Read())
                {
                    entra = reader.GetBoolean(0);
                }

                reader.Close();


            }
            catch (Exception ex)
            {
                throw ex;
            }


            if (entra)
            {
                Parametros[] parametros = new Parametros[1];
                String sql = @"Update dbo.T_Blog SET estado = 0 where id_usuario = param1";

                parametros[0] = new Parametros(pid, "param1");

                try
                {

                    if (ptransaccion == null)
                    {
                        _acceso.executeSQL(sql, parametros);
                        Modulo.insertarBitacora(pIdUsuario, "Desactivacion de un Blog", pid, 10, 5);
                    }
                    else
                    {
                        _acceso.executeSQLTransation(ptransaccion, sql, parametros);
                    }
                    msj = "¡El blog ha sido desactivado!";

                }
                catch (Exception)
                {
                    throw new Exception("Error al desactivar el blog y devolver la Base de Datos a un estado válido.");
                }

            }
            else {
                msj = "¡El blog ya estaba desactivado!";
            }

            return msj;

        }


        internal String activarBlog(int pid, int pIdUsuario, SqlTransaction ptransaccion)//parametros del grupo
        {

            bool entra = false;
            String msj;

            try
            {

                string psp = @"dbo.sp_buscar_estado_blog";

                Parametros[] parametros1 = new Parametros[1];
                parametros1[0] = new Parametros(pid, "id");

                SqlDataReader reader = _acceso.execute_SP_Consulta(psp, parametros1);

                while (reader.Read())
                {

                    entra = reader.GetBoolean(0);

                }

                reader.Close();

            }
            catch (Exception ex)
            {
                throw ex;
            }


            if (!entra)
            {

                Parametros[] parametros = new Parametros[1];
                String sql = @"Update dbo.T_Blog SET estado = 1 where id_usuario = param1";

                parametros[0] = new Parametros(pid, "param1");

                try
                {
                    int id = -1;

                    if (ptransaccion == null)
                    {
                        _acceso.executeSQL(sql, parametros);
                    }
                    else
                    {
                        _acceso.executeSQLTransation(ptransaccion, sql, parametros);
                    }
                    msj = "¡El blog ha sido activado!";
                }
                catch (Exception)
                {
                    throw new Exception("Error al desactivar el blog y devolver la Base de Datos a un estado válido.");
                }
            }
            else 
            {
                msj = "¡El blog ya estaba activado!";
            }
            return msj;
        }

        
        public void eliminarComentarioEntrada(int pidEntrada, int pIdusuario)
        {
            try
            {
                String sql = @"delete dbo.T_Comentario_Entrada     
					            where id_Entrada = param1";

                Parametros[] parametros = new Parametros[1];
                parametros[0] = new Parametros(pidEntrada, "param1");

                _acceso.executeSQL(sql, parametros);

                Modulo.insertarBitacora(pIdusuario, "Eliminación de Comentario Entrada", pIdusuario, 8, 3);
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        public void eliminarEntradaBlog(int pidEntrada, int pIdusuario)
        {
            try
            {
                String sql = @"delete dbo.T_Entrada     
					            where id_Entrada = param1";

                Parametros[] parametros = new Parametros[1];
                parametros[0] = new Parametros(pidEntrada, "param1");

                _acceso.executeSQL(sql, parametros);

                Modulo.insertarBitacora(pIdusuario, "Eliminación de Entrada", pIdusuario, 8, 3);
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        public void denunciarBlog(int pidBlog, int pidUsuario) {
            try
            {
                String sql = @"Update dbo.T_Blog SET bloqueado = 1 where id_blog = param1";

                Parametros[] parametros = new Parametros[1];
                parametros[0] = new Parametros(pidBlog, "param1");

                _acceso.executeSQL(sql, parametros);

                Modulo.insertarBitacora(pidBlog, "Denuncia de blog", pidUsuario, 8, 3);
            }
            catch (Exception ex)
            {

                throw ex;
            }
            
        }


        public  EsBlog obtenerBlogUsuario(int pIdUsuario){
            try
            {

                String sql = @"sp_obtener_blog_usuario";

                Parametros[] parametros = new Parametros[1];
                parametros[0] = new Parametros(pIdUsuario, "idUsuario");
               SqlDataReader reader = _acceso.execute_SP_Consulta(sql, parametros);



               if (reader.Read())
               {
                   EsBlog blog = new EsBlog(reader.GetInt32(0), reader.GetString(1), reader.GetInt32(2), 
                                            reader.GetBoolean(3), reader.GetBoolean(4), reader.GetString(5), 
                                            reader.GetInt32(6));

                   return blog;
               }


               throw new Exception("El usuario no tiene blog.");
            }
            catch (Exception ex)
            {
                
                throw ex;
            }

            }
    }
}
